package com.huaxin.device.dto.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import com.huaxin.hxenum.base.BaseCodeEnum;
import com.huaxin.hxenum.base.Colorful;
import com.huaxin.hxenum.base.Describable;

/**
 * 防水等级枚举类 - 基于国际通用的 IP (Ingress Protection) 标准
 * 第二位数字表示防水等级（0-9），常见如：IPX5、IPX6 等
 */
public enum WaterproofGrade implements BaseCodeEnum<String>, Describable, Colorful {

    IPX0("IPX0", "无防护", "对水无任何防护", "#F5222D"),         // 红色 - 危险

    IPX1("IPX1", "防垂直滴水", "垂直方向滴水无影响", "#FAAD14"),   // 橙红 - 低等

    IPX2("IPX2", "防倾斜15°滴水", "设备倾斜至15°时垂直滴水无影响", "#FFBF00"), // 橙黄

    IPX3("IPX3", "防淋水", "防止与垂直方向≤60°的淋水", "#108EE9"),  // 蓝色

    IPX4("IPX4", "防溅水", "可防止来自任何方向的溅水", "#108EE9"),

    IPX5("IPX5", "防喷水", "可承受来自任何方向的低压喷水（喷嘴 6.3mm）", "#00A854"), // 绿色 - 安全

    IPX6("IPX6", "防强烈喷水", "可承受来自任何方向的高压喷水", "#00A854"),

    IPX7("IPX7", "防短时浸水", "可在1米深水中浸泡30分钟", "#52C41A"),

    IPX8("IPX8", "持续潜水", "可在制造商规定的深度下长期潜水", "#0052D9"), // 深蓝 - 高防护

    IPX9("IPX9", "高温高压喷水", "可承受高温高压喷洗（如车辆清洗）", "#000000"); // 黑色 - 最高等级

    @EnumValue
    private final String code;
    private final String displayName;
    private final String description;
    private final String color;

    WaterproofGrade(String code, String displayName, String description, String color) {
        this.code = code;
        this.displayName = displayName;
        this.description = description;
        this.color = color;
    }

    @JsonValue
    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getDisplayName() {
        return displayName;
    }

    @Override
    public String getDescription() {
        return description;
    }

    @Override
    public String getColor() {
        return color;
    }

    /**
     * 根据 code 获取枚举实例
     */
    public static WaterproofGrade of(String code) {
        for (WaterproofGrade level : values()) {
            if (level.code.equalsIgnoreCase(code)) {
                return level;
            }
        }
        return null;
    }

    /**
     * 校验 code 是否有效
     */
    public static boolean isValid(String code) {
        return of(code) != null;
    }
}
